//package com.example.questionsystem.modules.qu.util;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import org.apache.http.entity.mime.MultipartEntityBuilder;
//import org.apache.http.impl.client.CloseableHttpClient;
//import org.apache.poi.xwpf.usermodel.*;
//import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
//import sun.net.www.http.HttpClient;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import org.apache.http.HttpEntity;
//import org.apache.http.HttpResponse;
//
//import org.apache.http.client.methods.HttpPost;
//import org.apache.http.entity.ContentType;
//
//import org.apache.http.impl.client.HttpClients;
//import org.apache.http.util.EntityUtils;
//import static org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc.*;
//
//public class WordToHtmlConverterNew {
//
//    // 辅助类，用于保存Run的文本和样式
//    private static class RunInfo {
//        String text;
//        Map<String, String> styles;
//
//        RunInfo(String text, Map<String, String> styles) {
//            this.text = text;
//            this.styles = styles;
//        }
//    }
//
//    // 处理段落（含样式）
//    public static String processParagraph(XWPFParagraph para ,String projectId,String subjectId) {
//        StringBuilder paraHtml = new StringBuilder();
//        String paragraphStyle = getParagraphStyle(para);
//        paraHtml.append("<p style='").append(paragraphStyle).append("'>");
//
//        List<RunInfo> runInfos = new ArrayList<>();
//        for (XWPFRun run : para.getRuns()) {
//            String text = run.getText(0);
//            if (text == null || text.trim().isEmpty()) continue;
//            Map<String, String> styles = getRunStyles(run);
//            runInfos.add(new RunInfo(text, styles));
//        }
//
//        // 合并相邻相同样式的Run
//        List<RunInfo> mergedRuns = new ArrayList<>();
//        for (RunInfo current : runInfos) {
//            if (mergedRuns.isEmpty()) {
//                mergedRuns.add(current);
//            } else {
//                RunInfo last = mergedRuns.get(mergedRuns.size() - 1);
//                if (last.styles.equals(current.styles)) {
//                    last.text += current.text; // 合并文本
//                } else {
//                    mergedRuns.add(current);
//                }
//            }
//        }
//
//        // 生成HTML
//        for (RunInfo info : mergedRuns) {
//            if (info.styles.isEmpty()) {
//                paraHtml.append(info.text);
//            } else {
//                paraHtml.append("<span style='");
//                info.styles.forEach((k, v) -> paraHtml.append(k).append(":").append(v).append(";"));
//                paraHtml.append("'>").append(info.text).append("</span>");
//            }
//        }
//
//        // 处理图片（保持原有逻辑）
//        for (XWPFRun run : para.getRuns()) {
//            for (XWPFPicture picture : run.getEmbeddedPictures()) {
//                paraHtml.append(processImage1(picture,projectId,subjectId));
//            }
//        }
//
//        paraHtml.append("</p>");
//        return paraHtml.toString();
//    }
//
//    // 处理表格（含合并单元格）
//    public static String processTable(XWPFTable table,String projectId,String subjectId) {
//        StringBuilder tableHtml = new StringBuilder();
//        tableHtml.append("<table border='1' cellpadding='5' cellspacing='0' style='border-collapse: collapse;'>");
//        for (XWPFTableRow row : table.getRows()) {
//            tableHtml.append("<tr>");
//            for (XWPFTableCell cell : row.getTableCells()) {
//                tableHtml.append(processTableCell(cell,projectId,subjectId));
//            }
//            tableHtml.append("</tr>");
//        }
//        tableHtml.append("</table>");
//        return tableHtml.toString();
//    }
//
//    // 处理单元格（含嵌套内容）
//    private static String processTableCell(XWPFTableCell cell,String projectId,String subjectId) {
//        StringBuilder cellHtml = new StringBuilder();
//        CTTcPr tcPr = cell.getCTTc().getTcPr();
//        Map<String, String> attrs = new HashMap<>();
//        Map<String, String> styles = new HashMap<>();
//
//        // 1. 处理单元格属性（合并、跨列）
//        if (tcPr != null) {
//            // 跨列
//            if (tcPr.getGridSpan() != null) {
//                attrs.put("colspan", String.valueOf(tcPr.getGridSpan().getVal()));
//            }
//            // 跨行
//            CTVMerge vMerge = tcPr.getVMerge();
//            if (vMerge != null) {
//                if (vMerge.getVal() == STMerge.RESTART) {
//                    attrs.put("rowspan", String.valueOf(getRowSpan(cell)));
//                } else if (vMerge.getVal() == STMerge.CONTINUE) {
//                    return ""; // 跳过被合并的单元格
//                }
//            }
//            // 背景色
//            if (tcPr.getShd() != null) {
//                styles.put("background-color", "#" + tcPr.getShd().getFill());
//            }
//        }
//
//        // 2. 处理单元格内所有内容（段落、嵌套表格）
//        for (IBodyElement elem : cell.getBodyElements()) {
//            if (elem instanceof XWPFParagraph) {
//                XWPFParagraph para = (XWPFParagraph) elem;
//                cellHtml.append(processParagraph(para,projectId,subjectId)); // 递归处理段落
//            } else if (elem instanceof XWPFTable) {
//                cellHtml.append(processTable((XWPFTable) elem,projectId,subjectId)); // 递归处理嵌套表格
//            }
//        }
//
//        // 3. 构建单元格HTML
//        cellHtml.insert(0, "<td" + buildAttributes(attrs) + " style='" + buildStyles(styles) + "'>");
//        cellHtml.append("</td>");
//        return cellHtml.toString();
//    }
//
//    // 服务端接收文件上传的 URL
//    private static final String UPLOAD_URL = "http://localhost:8101/question/uploadImage";
//
//     static  int i = 0;
//    // 处理图片（保留尺寸）
//    public static String processImage1(XWPFPicture picData,String projectId,String subjectId) {
//        try {
//            long widthEMU = picData.getCTPicture().getSpPr().getXfrm().getExt().getCx();
//            long heightEMU = picData.getCTPicture().getSpPr().getXfrm().getExt().getCy();
//            int widthPx = (int) (widthEMU / 914400.0 * 96);
//            int heightPx = (int) (heightEMU / 914400.0 * 96);
//
//            // 创建 HttpClient 实例
//            CloseableHttpClient httpClient = HttpClients.createDefault();
//            // 创建 HttpPost 请求
//            HttpPost httpPost = new HttpPost(UPLOAD_URL);
//            String imgType = String.valueOf(picData.getPictureData().getPictureType());
//            // 构建多部分实体，用于上传文件
//            MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
//            entityBuilder.addBinaryBody("file", picData.getPictureData().getData(),
//                    ContentType.create("image/" + picData.getPictureData().getPictureType()),
//                    "image_" + projectId +"_" + subjectId +i++ + "."+ picData.getPictureData().suggestFileExtension()  );
//            HttpEntity entity = entityBuilder.build();
//            httpPost.setEntity(entity);
//
//            // 执行请求
//            HttpResponse response = httpClient.execute(httpPost);
//            int statusCode = response.getStatusLine().getStatusCode();
//            if (statusCode == 200) {
//                // 解析服务端返回的图片访问 URL
//                String responseBody = EntityUtils.toString(response.getEntity());
//                JSONObject jsonObject = JSONObject.parseObject(responseBody);
//                return String.format(
//                        "<img src='%s' style='width:%dpx; height:%dpx;'/>",
//                        jsonObject.get("data"), widthPx, heightPx
//                );
//            } else {
//
//                return "[图片上传失败，状态码: " + statusCode + "]";
//            }
//
//        } catch (Exception e) {
//            e.printStackTrace();
//            return "[图片处理失败]";
//        }
//    }
//    // 处理图片（保留尺寸）
//    public static String processImage(XWPFPicture picData) {
//        try {
//            long widthEMU = picData.getCTPicture().getSpPr().getXfrm().getExt().getCx();
//            long heightEMU = picData.getCTPicture().getSpPr().getXfrm().getExt().getCy();
//            int widthPx = (int) (widthEMU / 914400.0 * 96);
//            int heightPx = (int) (heightEMU / 914400.0 * 96);
//            String base64 = java.util.Base64.getEncoder().encodeToString(picData.getPictureData().getData());
//            String imgType = String.valueOf(picData.getPictureData().getPictureType());
//            return String.format(
//                    "<img src='data:image/%s;base64,%s' style='width:%dpx; height:%dpx;'/>",
//                    imgType, base64, widthPx, heightPx
//            );
//        } catch (Exception e) {
//            return "[图片处理失败]";
//        }
//    }
//    // 获取段落样式（对齐、缩进）
//    private static String getParagraphStyle(XWPFParagraph para) {
//        StringBuilder style = new StringBuilder();
//        CTPPr pPr = para.getCTP().getPPr();
//        if (pPr != null) {
//            // 对齐方式
//            if (pPr.getJc() != null) {
//                STJc.Enum val = pPr.getJc().getVal();
//                if (val.equals(CENTER)) {
//                    style.append("text-align:center;");
//                } else if (val.equals(RIGHT)) {
//                    style.append("text-align:right;");
//                } else if (val.equals(LEFT)) {
//                    style.append("text-align:left;");
//                }
//            }
//            // 缩进
//            if (pPr.getInd() != null && pPr.getInd().getLeft() != null) {
//                long leftIndent = pPr.getInd().getLeft().longValue();
//                style.append("text-indent:").append(leftIndent / 20).append("pt;");
//            }
//        }
//        return style.toString();
//    }
//
//    // 获取文本样式（颜色、加粗、斜体）
//    private static Map<String, String> getRunStyles(XWPFRun run) {
//        Map<String, String> styles = new HashMap<>();
//        CTRPr rPr = run.getCTR().getRPr();
//        if (rPr != null) {
//            // 处理字体颜色（仅处理直接颜色值）
//            // 处理字体颜色
//            if (rPr.isSetColor()) {
//                CTColor color = rPr.getColor();
//                Object val = color.getVal();
//                String colorVal = val.toString();
//                // 1. 处理主题色 (需要特殊处理)
//                if (color.isSetThemeColor()) {
//                    STThemeColor.Enum themeColorEnum = color.getThemeColor();
//                    if (themeColorEnum != null) {
//                        // 通过枚举名称获取主题色映射
//                        String themeColorName = themeColorEnum.toString().replace("STThemeColor.", "");
//                        String hexColor = mapThemeColor(themeColorName);
//                        styles.put("color", hexColor);
//                    }
//                }
//                // 2. 处理直接色值
//                else if (colorVal != null) {
//                    // 补全6位十六进制
//                    if (colorVal.matches("^[0-9A-Fa-f]{3}$")) {
//                        colorVal = colorVal.replaceAll("(.)", "$1$1"); // ABC -> AABBCC
//                    }
//                    if (colorVal.matches("^[0-9A-Fa-f]{6}$")) {
//                        styles.put("color", "#" + colorVal);
//                    }
//                }
//                // 3. 处理自动颜色（默认黑色）
//                else if ("auto".equalsIgnoreCase(colorVal)) {
//                    styles.put("color", "#000000");
//                }
//            }
//            // 加粗
//            if (rPr.getB() != null && (!rPr.getB().isSetVal() || rPr.getB().getVal().intValue() == STOnOff.ON.intValue())) {
//                styles.put("font-weight", "bold");
//            }
//            // 斜体
//            if (rPr.getI() != null && (!rPr.getI().isSetVal() || rPr.getI().getVal().intValue() == STOnOff.ON.intValue())) {
//                styles.put("font-style", "italic");
//            }
//            // 字号
//            if (rPr.getSz() != null) {
//                styles.put("font-size", (rPr.getSz().getVal().intValue() / 2) + "pt");
//            }
//            // 下划线
//            if (rPr.getU() != null && rPr.getU().getVal() == STUnderline.SINGLE) {
//                styles.put("text-decoration", "underline");
//            }
//        }
//        return styles;
//    }
//// 主题色映射表（根据Office默认主题扩展）
//    private static String mapThemeColor(String themeColorName) {
//        switch (themeColorName) {
//            case "ACCENT_1": return "#4F81BD";  // Office默认蓝色
//            case "ACCENT_2": return "#C0504D";  // 红色
//            case "ACCENT_3": return "#9BBB59";  // 绿色
//            case "ACCENT_4": return "#8064A2";  // 紫色
//            case "ACCENT_5": return "#4BACC6";  // 浅蓝
//            case "ACCENT_6": return "#F79646";  // 橙色
//            case "DARK_1":   return "#000000";  // 黑色
//            case "LIGHT_1":  return "#FFFFFF";  // 白色
//            case "HYPERLINK":return "#0000FF";  // 超链接蓝
//            default:         return "#000000";  // 未知颜色默认黑色
//        }
//    }
//    // 计算跨行数
//    private static int getRowSpan(XWPFTableCell cell) {
//        int rowSpan = 1;
//        XWPFTableRow row = cell.getTableRow();
//        XWPFTable table = row.getTable();
//        int rowIndex = table.getRows().indexOf(row);
//        int colIndex = row.getTableCells().indexOf(cell);
//
//        for (int i = rowIndex + 1; i < table.getNumberOfRows(); i++) {
//            XWPFTableCell nextCell = table.getRow(i).getCell(colIndex);
//            if (nextCell != null && nextCell.getCTTc().getTcPr().getVMerge() != null &&
//                nextCell.getCTTc().getTcPr().getVMerge().getVal() == STMerge.CONTINUE) {
//                rowSpan++;
//            } else {
//                break;
//            }
//        }
//        return rowSpan;
//    }
//
//    // 辅助方法：构建HTML属性
//    private static String buildAttributes(Map<String, String> attrs) {
//        StringBuilder sb = new StringBuilder();
//        attrs.forEach((k, v) -> sb.append(" ").append(k).append("='").append(v).append("'"));
//        return sb.toString();
//    }
//
//    // 辅助方法：构建CSS样式
//    private static String buildStyles(Map<String, String> styles) {
//        StringBuilder sb = new StringBuilder();
//        styles.forEach((k, v) -> sb.append(k).append(":").append(v).append(";"));
//        return sb.toString();
//    }
//
//
//
//}